require 'model/connection'
require 'controller/bool'
require 'singleton'
require 'model/eleitor'
require "view/eleitor_view"
require "view/eleicao_view"

class EleitorDao
  
  include Singleton

  def initialize
    self
  end

  def save( nome ) # Cadastra um novo Eleitor.
    begin
      sql = "insert into eleitor (titulo, nome) values (NULL, ?)"
      conn = Connection.instance.get_conn
      conn.execute(sql, nome)
    rescue Exception
      PollerException.instance.throw(conn.errmsg, "[DAO] Verifique se o eleitor já está cadastrado.")
    end
  end

  def votar( eleitor, candidato)
    begin
      sql = "insert into voto (titulo, id_candidato, id_eleicao) values (?, ?, ?)"
      conn = Connection.instance.get_conn
      conn.execute(sql, eleitor.titulo, candidato.id, EleicaoView.instance.get_eleicao)
      # não permite que o mesmo eleitor vote outra vez.
      update_votou(eleitor.titulo)
      self
    rescue Exception
      PollerException.instance.throw(conn.errmsg, "[DAO] Erro ao computar o Voto.")
    end

  end

  def update_votou( titulo ) # Seta a flag votou da tabela eleitor para TRUE
    begin
      sql = "update eleitor set votou = 'TRUE' where titulo = ?"
      conn = Connection.instance.get_conn
      conn.execute(sql, titulo)
      self
    rescue Exception
      PollerException.instance.throw(conn.errmsg, "[DAO] Erro ao computar o Voto.")
    end

  end

  def reset
    begin
      sql = "UPDATE eleitor SET votou = 'FALSE'"
      conn = Connection.instance.get_conn
      conn.execute(sql)
      self
    rescue Exception
      PollerException.instance.throw(conn.errmsg, "[DAO] Erro ao reinicializar Eleição. Não foi possível resetar eleitores.")
    end
  end

  def votou?( titulo ) # Verifica se o eleitor já votou
    sql = "select votou from eleitor where titulo = ?"
    conn = Connection.instance.get_conn
    return Bool.to_b( conn.get_first_value(sql, titulo) )
  end

  def find?( titulo )
    sql = "select nome from eleitor where titulo = ?"
    conn = Connection.instance.get_conn
    nome = conn.get_first_value(sql, titulo)
    if nome == nil
      return false
    else
      return true
    end
  end

  def find_all
    sql = "select titulo, nome, votou from eleitor"
    conn = Connection.instance.get_conn
    rst = conn.query(sql)
    a_eleitores = Array.new
    rst.each do |row|
      eleitor = Eleitor.new
      eleitor.titulo = row[0].to_i
      eleitor.nome = row[1].to_s
      eleitor.votou = row[2]
      a_eleitores.push(eleitor)
    end
    rst.close
    return a_eleitores # Retorna o vetor de eleitores
  end

  def column_names
    sql = "select titulo, nome, votou from eleitor"
    conn = Connection.instance.get_conn
    conn.query(sql).columns
  end

  def presidente?( eleitor )
    sql = "select e.titulo, e.nome from eleitor e, eleicao l where l.presidente = ? AND l.id = ?"
    conn = Connection.instance.get_conn
    row = conn.get_first_row(sql, eleitor.titulo, EleicaoView.instance.get_eleicao)
    if row.nil?
      return false
    else
      return true
    end
  end
  
end
